home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Grafik / Misc / netpbm / bin / ppmfade < prev    next >
Encoding:
Text File  |  2000-01-01  |  9.8 KB  |  302 lines

  1. #!/bin/perl -w
  2. #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  3. #
  4. #  This program creates a fade (a sequence of frames) between two images.
  5. #
  6. #  Author:     Wesley C. Barris
  7. #              AHPCRC
  8. #              Minnesota Supercomputer Center, Inc.
  9. #  Date:       January 7, 1994
  10. #
  11. #  Converted to perl and renamed from pbmfade to ppmfade by Bryan Henderson
  12. #  on March 31, 2000 for inclusion in Netpbm.  Also, superfluous ability to 
  13. #  process other formats removed.
  14. #
  15. #  Copyright @ 1994, Minnesota Supercomputer Center, Inc.
  16. #
  17. #  RESTRICTED RIGHTS LEGEND
  18. #
  19. #  Use, duplication, or disclosure of this software and its documentation
  20. #  by the Government is subject to restrictions as set forth in subdivision
  21. #  { (b) (3) (ii) } of the Rights in Technical Data and Computer Software
  22. #  clause at 52.227-7013.
  23. #
  24. #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  25. use strict;
  26.  
  27. my $SPREAD =  1;
  28. my $SHIFT =   2;
  29. my $RELIEF =  3;
  30. my $OIL =     4;
  31. my $EDGE =    5;
  32. my $BENTLEY = 6;
  33. my $BLOCK =   7;
  34. #
  35. #  Set some defaults.
  36. #
  37. my $nframes = 30;            # total number of files created (1 sec)
  38. my $first_file = "undefined";
  39. my $last_file = "undefined";
  40. my $base_name = "fade";        # default base name of output files
  41. my $image = "ppm";        # default output storage format
  42. my $mode = $SPREAD;        # default fading mode
  43. #
  44. #  Check those command line args.
  45. #
  46. if (@ARGV == 0) {
  47.     usage();
  48. }
  49.  
  50. my $n;  # argument number
  51.  
  52. for ($n = 0; $n < @ARGV; $n++) {
  53.     if ("$ARGV[$n]" eq "-f") {
  54.         $n++;
  55.         $first_file = $ARGV[$n];
  56.         if (-e $first_file) {
  57.         } else {
  58.             print "I can't find $first_file\n";
  59.             exit 20;
  60.         }
  61.     } elsif ($ARGV[$n] eq "-l") {
  62.         $n++;
  63.         $last_file = $ARGV[$n];
  64.         if (-e $last_file) {
  65.         } else {
  66.             print "I can't find $last_file\n";
  67.             exit 20;
  68.         }
  69.     } elsif ($ARGV[$n] eq "-base") {
  70.         $n++;
  71.         $base_name = $ARGV[$n];
  72.     } elsif ($ARGV[$n] eq "-spread") {
  73.         $mode = $SPREAD;
  74.     } elsif ($ARGV[$n] eq "-shift") {
  75.         $mode = $SHIFT;
  76.     } elsif ($ARGV[$n] eq "-relief") {
  77.         $mode = $RELIEF;
  78.     } elsif ($ARGV[$n] eq "-oil") {
  79.         $mode = $OIL;
  80.     } elsif ("$ARGV[$n]" eq "-edge") {
  81.         $mode = $EDGE;
  82.     } elsif ("$ARGV[$n]" eq "-bentley") {
  83.         $mode = $BENTLEY;
  84.     } elsif ("$ARGV[$n]" eq "-block") {
  85.         $mode = $BLOCK;
  86.     } elsif ($ARGV[$n] eq "-help" || $ARGV[$n] eq "-h") {
  87.         usage();
  88.     } else {
  89.         print "Unknown argument: $ARGV[$n]\n";
  90.         exit 100;
  91.     } 
  92. }
  93. #
  94. #  Define a couple linear ramps.
  95. #
  96. # We don't use element 0 of these arrays.
  97. my @spline10 = (0, 0, 0.11, 0.22, 0.33, 0.44, 0.55, 0.66, 0.77, 0.88, 1.0);
  98. my @spline20 = (0, 0, 0.05, 0.11, 0.16, 0.21, 0.26, 0.32, 0.37, 0.42, 0.47, 
  99.                 0.53, 0.58, 0.63, 0.69, 0.74, 0.79, 0.84, 0.89, 0.95, 1.0);
  100. #
  101. #  Just what are we supposed to do?
  102. #
  103. my ($height, $width);    # width and height of our frames
  104. if ($first_file ne "undefined") {
  105.     if ((`pnmfile $first_file` =~ m{\b(\d+)\sby\s(\d+)} )) { 
  106.         $width = $1; $height = $2;
  107.     } else {
  108.         print("Unrecognized results from pnmfile on $first_file.\n");
  109.         exit(50);
  110.     }
  111. } elsif ($last_file ne "undefined") {
  112.     if ((`pnmfile $last_file` =~ m{\b(\d+)\sby\s(\d+)} )) { 
  113.         $width = $1; $height = $2;
  114.     } else {
  115.         print("Unrecognized results from pnmfile on $first_file.\n");
  116.         exit(50);
  117.     }
  118. } else {
  119.     print("ppmfade:  You must specify -f or -l (or both)\n");
  120.     exit(90);
  121. }
  122.  
  123. print("Frames are " . $width . "W x " . $height . "H\n");
  124.  
  125. if ($first_file eq "undefined") {
  126.     print "Fading from black to ";
  127.     system("ppmmake \\#000 $width $height >junk1$$.ppm");
  128. } else {
  129.     print "Fading from $first_file to ";
  130.     system("cp", $first_file, "junk1$$.ppm");
  131. }
  132.  
  133. if ($last_file eq "undefined") {
  134.     print "black.\n";
  135.     system("ppmmake \\#000 $width $height >junk2$$.ppm");
  136. } else {
  137.     print "$last_file\n";
  138.     system("cp", $last_file, "junk2$$.ppm");
  139. }
  140.  
  141. #
  142. #  Perform the fade.
  143. #
  144. my $i;    # Frame number
  145. for ($i = 1; $i <= $nframes; $i++) {
  146.     print("Creating $i of $nframes...\n");
  147.     if ($mode eq $SPREAD) {
  148.         if ($i <= 10) {
  149.             my $n = $spline20[$i] * 100;
  150.             system("ppmspread $n junk1$$.ppm >junk3$$.ppm");
  151.         } elsif ($i <= 20) {
  152.             my $n;
  153.             $n = $spline20[$i] * 100;
  154.             system("ppmspread $n junk1$$.ppm >junk1a$$.ppm");
  155.             $n = (1-$spline20[$i-10]) * 100;
  156.             system("ppmspread $n junk2$$.ppm >junk2a$$.ppm");
  157.             $n = $spline10[$i-10];
  158.             system("ppmmix $n junk1a$$.ppm junk2a$$.ppm >junk3$$.ppm");
  159.         } else {
  160.             my $n = (1-$spline20[$i-10])*100;
  161.             system("ppmspread $n junk2$$.ppm >junk3$$.ppm");
  162.         }
  163.     } elsif ($mode eq $SHIFT) {
  164.         if ($i <= 10) {
  165.             my $n = $spline20[$i] * 100;
  166.             system("ppmshift $n junk1$$.ppm >junk3$$.ppm");
  167.         } elsif ($i <= 20) {
  168.             my $n;
  169.             $n = $spline20[$i] * 100;
  170.             system("ppmshift $n junk1$$.ppm >junk1a$$.ppm");
  171.             $n = (1-$spline20[$i-10])*100;
  172.             system("ppmshift $n junk2$$.ppm >junk2a$$.ppm");
  173.             $n = $spline10[$i-10];
  174.             system("ppmmix $n junk1a$$.ppm junk2a$$.ppm >junk3$$.ppm");
  175.         } else {
  176.             my $n = (1-$spline20[$i-10]) * 100;
  177.             system("ppmshift $n junk2$$.ppm >junk3$$.ppm");
  178.         }
  179.     } elsif ($mode eq $RELIEF) {
  180.         if ($i == 1) {
  181.             system("ppmrelief junk1$$.ppm >junk1r$$.ppm");
  182.         }
  183.         if ($i <= 10) {
  184.             my $n = $spline10[$i];
  185.             system("ppmmix $n junk1$$.ppm junk1r$$.ppm >junk3$$.ppm");
  186.         } elsif ($i <= 20) {
  187.             my $n = $spline10[$i-10];
  188.             system("ppmmix $n junk1r$$.ppm junk2r$$.ppm >junk3$$.ppm");
  189.         } else {
  190.             my $n = $spline10[$i-20];
  191.             system("ppmmix $n junk2r$$.ppm junk2$$.ppm >junk3$$.ppm");
  192.         }
  193.         if ($i == 10) {
  194.             system("ppmrelief junk2$$.ppm >junk2r$$.ppm");
  195.         }
  196.     } elsif ($mode eq $OIL) {
  197.         if ($i == 1) {
  198.             system("ppmtopgm junk1$$.ppm | pgmoil >junko$$.ppm");
  199.             system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
  200.                    ">junk1o$$.ppm");
  201.         }
  202.         if ($i <= 10) {
  203.             my $n = $spline10[$i];
  204.             system("ppmmix $n junk1$$.ppm junk1o$$.ppm >junk3$$.ppm");
  205.         } elsif ($i <= 20) {
  206.             my $n = $spline10[$i-10];
  207.             system("ppmmix $n junk1o$$.ppm junk2o$$.ppm >junk3$$.ppm");
  208.         } else {
  209.             my $n = $spline10[$i-20];
  210.             system("ppmmix $n junk2o$$.ppm junk2$$.ppm >junk3$$.ppm");
  211.         }
  212.         if ($i == 10) {
  213.             system("ppmtopgm junk2$$.ppm | pgmoil >junko$$.ppm");
  214.             system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
  215.                    ">junk2o$$.ppm");
  216.         }
  217.     } elsif ($mode eq $EDGE) {
  218.         if ($i == 1) {
  219.             system("ppmtopgm junk1$$.ppm | pgmedge >junko$$.ppm");
  220.             system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
  221.                    ">junk1o$$.ppm");
  222.         }
  223.         if ($i <= 10) {
  224.             my $n = $spline10[$i];
  225.             system("ppmmix $n junk1$$.ppm junk1o$$.ppm >junk3$$.ppm");
  226.         } elsif ($i <= 20) {
  227.             my $n = $spline10[$i-10];
  228.             system("ppmmix $n junk1o$$.ppm junk2o$$.ppm >junk3$$.ppm");
  229.         } else {
  230.             my $n = $spline10[$i-20];
  231.             system("ppmmix $n junk2o$$.ppm junk2$$.ppm >junk3$$.ppm");
  232.         }
  233.         if ($i == 10) {
  234.             system("ppmtopgm junk2$$.ppm | pgmedge >junko$$.ppm");
  235.             system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
  236.                    ">junk2o$$.ppm");
  237.         } 
  238.     } elsif ($mode eq $BENTLEY) {
  239.         if ($i == 1) {
  240.             system("ppmtopgm junk1$$.ppm | pgmbentley >junko$$.ppm");
  241.             system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
  242.                    ">junk1o$$.ppm");
  243.         }
  244.         if ($i <= 10) {
  245.             my $n = $spline10[$i];
  246.             system("ppmmix $n junk1$$.ppm junk1o$$.ppm >junk3$$.ppm");
  247.         } elsif ($i <= 20) {
  248.             my $n = $spline10[$i-10];
  249.             system("ppmmix $n junk1o$$.ppm junk2o$$.ppm >junk3$$.ppm");
  250.         } else {
  251.             my $n = $spline10[$i-20];
  252.             system("ppmmix $n junk2o$$.ppm junk2$$.ppm >junk3$$.ppm");
  253.         }
  254.         if ($i == 10) {
  255.             system("ppmtopgm junk2$$.ppm | pgmbentley >junko$$.ppm");
  256.             system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
  257.                    ">junk2o$$.ppm");
  258.         }
  259.     } elsif ($mode eq $BLOCK) {
  260.         if ($i <= 10) {
  261.             my $n = 1 - 1.9*$spline20[$i];
  262.             system("pnmscale $n junk1$$.ppm | " .
  263.                    "pnmscale -width $width -height $height >junk3$$.ppm");
  264.         } elsif ($i <= 20) {
  265.             my $n = $spline10[$i-10];
  266.             system("ppmmix $n junk1a$$.ppm junk2a$$.ppm >junk3$$.ppm");
  267.         } else {
  268.             my $n = 1 - 1.9*$spline20[31-$i];
  269.             system("pnmscale $n junk2$$.ppm | " .
  270.                    "pnmscale -width $width -height $height >junk3$$.ppm");
  271.         }
  272.         if ($i == 10) {
  273.             system("cp", "junk3$$.ppm", "junk1a$$.ppm");
  274.             system("pnmscale $n junk2$$.ppm | " .
  275.                    "pnmscale -width $width -height $height >junk2a$$.ppm");
  276.         }
  277.     } else {
  278.         print("Internal error: impossible mode value '$mode'\n");
  279.     }
  280.  
  281.     my $outfile = sprintf("%s.%04d.ppm", $base_name, $i);
  282.     system("cp", "junk3$$.ppm", $outfile);
  283. }
  284.  
  285. #
  286. #  Clean up shop.
  287. #
  288. system("rm junk*$$.ppm");
  289.  
  290. exit(0);
  291.  
  292.  
  293.  
  294. sub usage() {
  295.    print "Usage: ppmfade [-f first_file] [-l last_file]\n";
  296.    print "               [-spread|-out|-relief|-oil|-edge|-bentley|-block]\n";
  297.    print "               [-base basename]\n";
  298.    print "Notes: Default base: fade\n";
  299.    print "       The resulting image files will be named fade.NNNN.ppm.\n";
  300.    exit(100);
  301. }
  302.